const { sequelize } = require('../config/database');
const ProductConfig = require('../models/ProductConfig');
const PaymentOrder = require('../models/PaymentOrder');

/**
 * 此脚本用于向 payment_orders 表添加 type 字段，并填充现有数据
 */
async function migrate() {
  const transaction = await sequelize.transaction();
  
  try {
    console.log('开始迁移: 向 payment_orders 表添加 type 字段');
    
    // 检查字段是否已存在
    const tableInfo = await sequelize.query(
      "SHOW COLUMNS FROM payment_orders LIKE 'type'",
      { transaction }
    );
    
    // 如果字段不存在，则添加
    if (tableInfo[0].length === 0) {
      console.log('添加 type 字段...');
      await sequelize.query(
        "ALTER TABLE payment_orders ADD COLUMN type ENUM('disposable', 'subscription') COMMENT '订单类型：disposable=一次性，subscription=订阅'",
        { transaction }
      );
      console.log('type 字段已添加');
    } else {
      console.log('type 字段已存在，跳过创建');
    }
    
    // 更新现有数据
    console.log('开始更新现有数据的订单类型...');
    
    // 获取所有缺少类型的订单
    const orders = await PaymentOrder.findAll({
      where: {
        type: null
      },
      transaction
    });
    
    console.log(`找到 ${orders.length} 条需要更新的订单记录`);
    
    // 批量更新订单的类型
    let updatedCount = 0;
    for (const order of orders) {
      // 查找对应的产品配置
      const productConfig = await ProductConfig.findOne({
        where: { stripe_price_id: order.stripe_price_id },
        transaction
      });
      
      if (productConfig) {
        // 根据产品类型设置订单类型
        let orderType;
        if (productConfig.product_type === 'subscription') {
          orderType = 'subscription';
        } else {
          orderType = 'disposable';
        }
        
        await order.update({
          type: orderType
        }, { transaction });
        updatedCount++;
      }
    }
    
    console.log(`成功更新 ${updatedCount} 条订单记录的类型`);
    
    await transaction.commit();
    console.log('迁移完成！');
    
  } catch (error) {
    await transaction.rollback();
    console.error('迁移失败:', error);
  } finally {
    process.exit();
  }
}

// 运行迁移脚本
migrate(); 